技巧7 允许容器通信

技巧6展示的是如何通过公开端口将容器开放给宿主机网络。用户不会总想将服务公开给宿主机或外界,但是会希望容器彼此相连。

本技巧展示的是如何通过Docker的用户自定义网络特性来实现这一点,并确保外人无法访问内部服务。

问题

出于内部目的,想要让容器间实现通信。

解决方案

使用用户自定义网络让容器进行相互通信。

用户自定义网络简单而灵活。在技巧6中,我们拥有了多个运行在容器中的WordPress博客,现在我们来看看如何从别的容器(而不是从外界,这点你已经看到了)访问它们。

首先需要创建用户自定义网络:

$ docker network create my_network
0c3386c9db5bb1d457c8af79a62808f78b42b3a8178e75cc8a252fac6fdc09e4

这条命令在你的机器上创建了一个新的虚拟网络,你可以用它来管理容器通信。默认情况下,所有连接到这个网络的容器都可以通过名称看到彼此。

接下来,假设你还运行着来自上技巧6的 blog1blog2 容器,你可以动态地将它们连接到你的新网络中。

$ docker network connect my_network blog1

最后,你可以启动一个新的容器,显式地指定其网络,看看是否能获取博客落地页的前5行。

$ docker run -it --network my_network ubuntu:16.04 bash
root@06d6282d32a5:/# apt update && apt install -y curl
[...]
root@06d6282d32a5:/# curl -sSL blog1 | head -n5
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en-US" xml:lang="en-US">
<head>
    <meta name="viewport" content="width=device-width" />
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
root@06d6282d32a5:/# curl -sSL blog2
curl: (6) Could not resolve host: blog2

提示

给容器命名对于分配后续引用的可记忆主机名是非常有用的,不过这不是严格必需的——如果连接只对外,你多半不需要查找容器。如果你发现确实想查找主机,又未指定名称,则可以使用终端提示栏或 docker ps 输出中列出的镜像短ID(除非它被主机名覆盖了)。

新的容器成功访问了连接到 my_network 的博客,显示了我们之前在浏览器中访问时所看到的页面HTML代码。另一方面,新的容器看不到第二个博客。因为我们从未将它连接到 my_network 上,这很合理。

讨论

你可以使用这个技巧将任何数量的容器设置成一个基于自身私有网络的集群,只要求容器可以以某种方式发现各自的名称即可。在技巧80中,你将看到本技巧与Docker网络良好整合的一个方法。与此同时,技巧8将以更小体积起步,演示的是在单个容器及其提供的服务之间建立明确联系的益处。

另一个值得注意的点是容器 blog1 有趣的最终状态。所有容器会默认连接到Docker桥接网络上,因此当我们要求 blog1 加入 my_network 时,除了其所处的网络,它也会连接到 my_network 网络上。在技巧80中,我们将详细讨论这个问题,看看如何将跨网络作为某些现实情况的模型来使用。

results matching ""

    No results matching ""